Заметки докладчика:
- Это вводная лекция курса. Цель — дать общее представление об ООП и его роли в сетевом программировании.
- Уделить больше внимание практической составляющей курса: C++ и Qt6.
- Можно упомянуть, что в рамках курса студенты создадут полноценное клиент-серверное приложение (курсовой проект).
- Рекомендуется спросить студентов, с какими языками программирования они уже знакомы, чтобы адаптировать примеры.
Заметки докладчика:
- Акцентировать внимание: основной инструмент курса — C++ с фреймворком Qt6.
- Упомянуть, что Qt — кроссплатформенный фреймворк, широко используемый в промышленности.
- Курсовой проект будет заключаться в разработке клиент-серверного приложения на Qt.
- Для китайской программы: темы 1-8 перезачтены, акцент на темах 9-11 (сетевое взаимодействие, GUI, распределённая обработка).
Заметки докладчика:
- Объяснить разницу на простом примере: императивный — «отсортировать массив пузырьком» (шаг за шагом), декларативный — «выбрать все записи где возраст > 18» (SQL).
- Упомянуть, что C++ поддерживает несколько парадигм: императивную, ООП, обобщённое программирование (шаблоны) и частично функциональную (лямбды).
- QML (часть Qt) — это декларативный язык для описания UI.
Заметки докладчика:
- Инкапсуляция: подчеркнуть, что это не просто «private», а проектирование API класса. Аналогия — пульт управления телевизором: кнопки (интерфейс), внутренняя схема скрыта.
- Наследование: предупредить о проблеме «божественного объекта» и глубокой иерархии. Правило: наследование — это отношение «IS-A» (является).
- Полиморфизм: один из самых важных принципов для сетевого программирования — позволяет писать универсальный код для разных протоколов.
- В C++ полиморфизм реализуется через virtual-функции (динамический) и шаблоны/перегрузку (статический).
Заметки докладчика:
- Обратить внимание на модификаторы доступа: private (скрыто), public (доступно извне).
- Упомянуть, что в реальном коде стоит добавлять валидацию в сеттеры (проверка IP-адреса, диапазон портов).
- В Qt принято использовать Q_PROPERTY для инкапсуляции (будет рассмотрено в лекции 12).
- Отметить метод isConnected() с модификатором const — он не изменяет состояние объекта.
Заметки докладчика:
- Ключевое слово public перед NetworkDevice означает public-наследование (отношение «является»).
- Router имеет доступ к protected-членам базового класса (mac_address, ip_address).
- Метод configurePort() демонстрирует вызов методов базового класса из производного.
- В Qt наследование от QObject — основа для использования сигналов/слотов и метасистемы.
Заметки докладчика:
- = 0 обозначает чисто виртуальную функцию — класс NetworkProtocol становится абстрактным.
- virtual ~NetworkProtocol() = default — виртуальный деструктор ОБЯЗАТЕЛЕН для базовых классов с виртуальными функциями. Без него при удалении через указатель на базовый класс будет UB.
- Ключевое слово override (C++11) позволяет компилятору проверить правильность переопределения.
- В Qt аналогом являются классы с Q_OBJECT и виртуальные методы в иерархии.
Заметки докладчика:
- Функция sendNetworkData принимает указатель на базовый класс, но вызывается метод конкретного производного класса — это и есть динамический полиморфизм.
- Механизм: vtable (таблица виртуальных функций) и vptr (указатель на vtable в каждом объекте).
- На практике в сетевом программировании это позволяет единообразно работать с разными протоколами (TCP, UDP, WebSocket и т.д.).
- В современном C++ предпочтительнее использовать unique_ptr<NetworkProtocol> вместо сырых указателей.
Заметки докладчика:
- Программа требует ознакомления с реализациями ООП в разных языках.
- C++: максимальный контроль (ручное управление памятью, множественное наследование).
- Java: строгая ООП (всё — класс, интерфейсы как отдельная конструкция, сборщик мусора).
- Python: динамическая типизация, «питонийский» подход (конвенции вместо принуждения).
- Для данного курса мы используем C++ — он даёт наибольший контроль над ресурсами, что критично для сетевого программирования.
Заметки докладчика:
- Qt — пример масштабного применения ООП для кроссплатформенных сетевых приложений.
- Java Spring — самый популярный фреймворк для серверных приложений (микросервисы).
- Python asyncio — современный подход к асинхронному сетевому программированию.
- Все три примера используют принципы ООП: инкапсуляцию, наследование, полиморфизм.
Заметки докладчика:
Ожидаемые ответы:
1. Инкапсуляция, наследование, полиморфизм (иногда выделяют также абстракцию).
2. Императивная описывает «как» (последовательность команд), декларативная — «что» (свойства результата).
3. Через виртуальные функции (vtable/vptr) — динамический полиморфизм; через перегрузку и шаблоны — статический.
4. Модульность, повторное использование, расширяемость (легко добавить новый протокол), абстракция сложности.
5. Микросервисы (Java Spring, C++ gRPC), облачные платформы, игровые движки (Unreal Engine — C++), мобильные приложения (Qt).
6. C++: чисто виртуальный класс (= 0). Java: ключевое слово interface (отдельная конструкция, множественное наследование интерфейсов). Python: abc.ABC с @abstractmethod.
7. C++: компилятор принудительно проверяет private/protected/public. Python: _protected и __private — только конвенция, runtime не запрещает доступ (атрибут __name подменяется на _ClassName__name).